/**
 * 父组件传递 watchs 来处理表单子组件内部watch监听
 * props:
 *      watchs: 需要watch的数组 格式: [{key, handler, options}] (key: 表单字段名 , hanlder: 方法, options: watch 的配置参数)
 */

// 卸载watch
function unWatchs () {
    // 卸载旧watch
    if (Object.prototype.toString.call(this._watchCbs) === '[object Array]') {
        this._watchCbs.forEach(fn => fn())
        this._watchCbs = null
    }
}
// 绑定watch
function bindWatchs (watchs) {
    let cb = []
    watchs.forEach(watch => {
        const { key, handler, options } = watch
        if (this.form.hasOwnProperty(key) && typeof handler === 'function') {
            cb.push(this.$watch(`form.${key}`, handler, options || {}))
        }
    })
    this._watchCbs = cb // 缓存回调，下次watchs更改可以取消回调
}

export default {
    props: {
        // 需要观察的form数组 格式 [{key, handler, options}]
        watchs: {
            type: Array,
            default: function () {
                return []
            }
        }
    },
    watch: {
        'watchs': {
            handler (newVal, oldVal) {
                // 卸载旧watch
                unWatchs.call(this)
                // 绑定新watch
                bindWatchs.call(this, newVal)
            },
            immediate: true
        }
    },
    beforeDestroy () {
        unWatchs.call(this)
    }
}
